package com.czg.jsonschema2lombokpojo.config;

import com.czg.jsonschema2lombokpojo.SourceType;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 定义Java类型生成的配置选项，包括源和目标路径/包以及所有行为选项（例如是否生成构建器，是否使用原语等）。
 * <p>
 * Devs: 添加到这个接口，如果你需要引入一个新的配置属性。
 */
public interface GenerationConfig {



    /**
     * 类是否包含EqualsAndHashCode注解；注解用于简化Java类中equals和hashCode方法的实现。默认情况下，它会使用类中所有非静态、非瞬态的字段来生成这些方法。用户可以通过指定exclude参数来排除某些字段，或者使用of参数来仅包含特定的字段。此外，@EqualsAndHashCode(callSuper = true)参数可以在子类中使用，以包含父类的成员变量‌
     * @return
     */
    boolean isIncludeEqualsAndHashCode();

    /**
     * 类是否包含NoArgsConstructor注解；为类生成一个无参构造函数
     * @return
     */
    boolean isIncludeNoArgsConstructor();

    /**
     * 类是否包含AllArgsConstructor注解；自动生成一个包含所有类字段参数的构造函数
     * @return
     */
    boolean isIncludeAllArgsConstructor();

    /**
     * 类是否包含Builder注解；自动生成一个内部 Builder 类，以及对应的构建方法，从而简化代码的编写。
     * @return
     */
    boolean isIncludeBuilder();


    /**
     * 类是否包含FieldNameConstants注解；自动生成字段名称常量。
     * @return
     */
    boolean isFieldNameConstants();


    /**
     * 类是否包含Accessors注解；用于自动生成 getter 和 setter 方法，从而简化代码的编写。
     * @return
     */
    boolean isIncludeAccessors();

    /**
     * Accessors注解的fluent属性值：如果设置为 true，生成的 getter 方法会移除 get 前缀，setter 方法移除 set 前缀。
     * 配合isIncludeAccessors使用。isIncludeAccessors为true时起作用
     * @return
     */
    boolean getAccessorsFluentValue();

    /**
     * Accessors注解的chain属性值：如果设置为 true，生成的 setter 方法会返回当前对象，支持方法链调用。
     * 配合isIncludeAccessors使用。isIncludeAccessors为true时起作用
     *
     * @return
     */
    boolean getAccessorsChainValue();

    /**
     * Accessors注解的prefix属性值：为生成的 getter 和 setter 方法添加指定前缀。
     * 配合isIncludeAccessors使用。isIncludeAccessors为true时起作用
     *
     * @return
     */
    String getAccessorsPrefix();


    /**
     * 枚举类是否包含Getter注解；自动生成一个getter方法
     * @return
     */    boolean isEnumIncludeGetter();

    /**
     * 枚举类是否包含AllArgsConstructor注解；自动生成一个包含所有类字段参数的构造函数
     * @return
     */
    boolean isEnumIncludeAllArgsConstructor ();
    /**
     * 获取屬性字之間的分隔符。
     *
     * @return 一个字符数组，在选择Java bean属性名时充当单词分隔符。
     */
    char[] getPropertyWordDelimiters();

    /**
     * 是否使用长整数Long。
     *
     *
     * @return 表示JSONschema类型‘integer’，是否使用java类型<code>long</code>（或{@link java.lang.Long}）而不是<code>int</code>（或{@link java.lang.Integer}）。
     */
    boolean isUseLongIntegers();

    /**
     * 是否使用大整数BigInteger。
     *
     * @return 当JSONschema类型‘integer’时，是否使用java类型{@link java.math.BigInteger}而不是<code>int</code>（或{@link java.lang.Integer}）。
     * 注意，这个配置覆盖了{@link #isUseLongIntegers()}。
     */
    boolean isUseBigIntegers();

    /**
     * 获取‘useDoubleNumbers’配置选项。
     *
     * @return 当JSONschema类型‘number’，是否使用java类型<code>double</code>（或{@link java.lang.Double}）而不是<code>float</code>（或{@link java.lang.Float}）。
     */
    boolean isUseDoubleNumbers();

    /**
     * 获取‘useBigDecimals’配置选项。
     *
     * @return 当JSONschema类型‘number’时，是否使用java类型{@link java.math.BigDecimal}代替<code>float</code>（或{@link java.lang.Float}）。
     * 注意，这个配置覆盖了{@link #isUseDoubleNumbers()}。
     */
    boolean isUseBigDecimals();

    /**
     * 是否使用“title”属性值作为对象schema的类名。
     *
     * @return
     */
    boolean isUseTitleAsClassname();

    /**
     * 是否在生成合法性验证规则注解
     *
     * @return 是否在生成合法性验证规则。
     */
    boolean isIncludeValidationAnnotations();


    /**
     * 获取‘sourceType’配置选项。
     *
     * @return 将被读取的输入文档的类型
     *         <p>
     *         支持的類型：
     *         <ul>
     *         <li><code>jsonschema</code></li>
     *         <li><code>json</code></li>
     *         </ul>
     */
    SourceType getSourceType();

    /**
     * 是否使生成的类型为“serializable”
     *
     * @return
     */
    boolean isSerializable();

    /**
     * 是否将集合初始化为空实例或null。
     *
     * @return 是否将集合初始化为空实例或null。
     */
    boolean isInitializeCollections();

    /**
     * 类名称添加的前缀。
     *
     * @return 是否为生成的类添加前缀。
     */
    String getClassNamePrefix();

    /**
     * 类名称添加的后缀。
     *
     * @return 是否为生成的类添加后缀。
     */
    String getClassNameSuffix();

    /**
     * 文件的扩展名
     * 一个字符串数组，应该被视为文件扩展名，因此不包括在类名中。
     *
     * @return
     */
    String[] getFileExtensions();


    /**
     * 是否包含附加属性。
     *
     * @return 是否允许在对象中支持“附加属性”。将其设置为false将禁用其他属性支持，无论输入schema如何。
     */
    boolean isIncludeAdditionalProperties();

    /**
     * 生成java代码的目标版本。
     *
     * @return 生成源文件的目标版本。
     */
    String getTargetVersion();

    /**
     * 是否格式化Date
     * 类型<code>date</code>的字段是否有<code>@JsonFormat</code>注解，schema设置为默认值<code>yyyy-MM-dd</code>
     * @return
     */
    boolean isFormatDates();



    /**
     * 是否格式化DateTime
     * 类型<code>date-type</code>的字段是否有<code>@JsonFormat</code>注解，schema设置为默认值<code>yyyy-MM-dd HH:mm:ss.SSSZ></code>
     * @return
     */
    boolean isFormatDateTimes();

    /**
     * 自定义日期类型的格式，如： yyyy-MM-dd HH:mm:ss
     *日期在类型序列化时使用的自定义格式。需要您的 JSON 绑定库提供支持。
     *
     * @return
     */
    String getCustomDatePattern();

    /**
     * 获取Time显示方式
     *
     * @return 类型序列化时使用的自定义格式。需要JSON绑定库的支持。
     */
    String getCustomTimePattern();

    /**
     * 获取自定义DateTime显示方式
     *
     * @return 当类型序列化时，日期将使用的自定义格式。需要JSON绑定库的支持。
     */
    String getCustomDateTimePattern();

    /**
     * 获取$ref路径分隔符
     *
     * @return 一个字符串，它包含在解析$ref片段时作为路径分隔符的任何字符。默认为#，/和。是为了支持JSON指针和JSON路径。
     */
    String getRefFragmentPathDelimiters();


    /**
     * 是否使用jakartvalidation
     * 该属性与{@link #isIncludeValidationAnnotations()}配置选项协同工作。
     * 如果{@link #isIncludeValidationAnnotations()}返回{@code false}，则此配置选项不会影响任何内容。
     *
     * @return 是否使用<a href = " http: / / jcp.org / en / jsr / detail ? id = 3 0 3 ">JSR-303</a>注解从{@code雅加达。而不是{@code javax。将JSR-303注解添加到生成的Java类型时，验证}包
     */
    boolean isUseJakartaValidation();

    /**
     * 枚举类型是否放在enum子包中
     * @return
     */
    boolean isEnumInSubPackage();

    /**
     * 枚举类型添加enum后缀
     * @return
     */
    boolean isEnumTypeAddSuffix();
}
